package com.sun.module_mine.ui.timer

import java.util.concurrent.TimeUnit

/**
 *@author:sunc
 *@time :2025/8/14 15:42
 *@desc: 描述
 */
enum class TimerType(private val type: Int) {

    // 枚举常量，分别表示不同的计时器类型
    HH_MM_SS(0x00000111),  // 时分秒格式
    HH_MM(0x00000110),     // 时分格式
    MM_SS(0x00000011);     // 分秒格式

    // 私有属性，表示小时的掩码
    private val hour = 0x00000100
    // 私有属性，表示分钟的掩码
    private val minute = 0x00000010
    // 私有属性，表示秒的掩码
    private val second = 0x00000001

    /**
     * 检查是否启用了小时显示
     * @return 如果启用了小时显示则返回true，否则返回false
     */
    fun hourEnabled() = type.and(hour) == hour

    /**
     * 检查是否启用了分钟显示
     * @return 如果启用了分钟显示则返回true，否则返回false
     */
    fun minuteEnabled() = type.and(minute) == minute

    /**
     * 检查是否启用了秒显示
     * @return 如果启用了秒显示则返回true，否则返回false
     */
    fun secondEnabled() = type.and(second) == second
}

/**
 * 数据类：TimerData
 * 用于表示时间数据，将毫秒数转换为时分秒的各位数字表示
 * @property millis 毫秒数，默认为0
 * @property hourTens 小时数的十位数字
 * @property hourZero 小时数的个位数字
 * @property minuteTens 分钟数的十位数字
 * @property minuteZero 分钟数的个位数字
 * @property secondTens 秒数的十位数字
 * @property secondZero 秒数的个位数字
 */
data class TimerData(val millis: Long = 0) {
    // 小时数的十位数字
    val hourTens: String
    // 小时数的个位数字
    val hourZero: String
    // 分钟数的十位数字
    val minuteTens: String
    // 分钟数的个位数字
    val minuteZero: String
    // 秒数的十位数字
    val secondTens: String
    // 秒数的个位数字
    val secondZero: String

    // 初始化代码块，用于计算各个时间位的数字
    init {
        var millisRemains = millis // 剩余毫秒数
        // 计算小时数
        val hours = TimeUnit.MILLISECONDS.toHours(millisRemains)
        // 获取小时数的十位数字（24小时制）
        hourTens = (hours % 24).div(10).coerceIn(0L..9L).toString()
        // 获取小时数的个位数字（24小时制）
        hourZero = (hours % 24).rem(10).toString()
        // 减去已经计算的小时数对应的毫秒数
        millisRemains -= TimeUnit.HOURS.toMillis(hours)

        // 计算分钟数
        val minute = TimeUnit.MILLISECONDS.toMinutes(millisRemains)
        // 获取分钟数的十位数字
        minuteTens = minute.div(10).toString()
        // 获取分钟数的个位数字
        minuteZero = minute.rem(10).toString()
        // 减去已经计算的分钟数对应的毫秒数
        millisRemains -= TimeUnit.MINUTES.toMillis(minute)

        // 计算秒数
        val seconds = TimeUnit.MILLISECONDS.toSeconds(millisRemains)
        // 获取秒数的十位数字
        secondTens = seconds.div(10).toString()
        // 获取秒数的个位数字
        secondZero = seconds.rem(10).toString()

        // 以下两行为调试日志，已被注释
//        "TimerData: $hourTens $hourZero  $minuteTens $minuteZero $secondTens $secondZero".loge()
//        "TimerData: $millis $hours  $minute $seconds ".loge()
    }
}